﻿//Código desenvolvido na integra por Bruno Marques
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlServerCe;


namespace GestaoContas
{
    /// <summary>
    /// Gestão de quotas, pode-se inserir, editar e visualizar as quotas associadas a cada criança.
    /// </summary>
    public partial class FormQuotas : Form
    {   
        private string _connectionStringJardimBD;

        public FormQuotas()
        {
            InitializeComponent();
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
            PreencheComboBoxNomeCrianca(); //Quando o programa inicia, preencher as combo boxes com o nome da Criança.
        }

        /// <summary>
        /// Insere os dados na base de dados, quando o utilizador assim o deseja, enviando os parametros do id da criança, a data da quota, o montante da quota.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonOk_Click(object sender, EventArgs e)
        {
            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            try
            {
                String data = dateTimePicker1.Value.Year + "-" + dateTimePicker1.Value.Month + "-" + dateTimePicker1.Value.Day;
                string varSql = "INSERT INTO Quota(Data,Valor,EstadoPago,Crianca_CriancaId) VALUES ('" + data + "'," + int.Parse(textBoxValor.Text) + ",0," + comboBoxNomeCrianca.SelectedValue + ")";
                SqlCeCommand cmd = new SqlCeCommand(varSql, conn);
                cmd.ExecuteNonQuery();
                actualizar();
                MessageBox.Show("Quota inserida");
                PreencheComboBoxNomeCrianca();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            conn.Close();

        }

        /// <summary>
        /// Serve para preencher as comboboxs todas associadas ao nome da criança.
        /// </summary>
        private void PreencheComboBoxNomeCrianca()
        {
            try
            {
                string query = @"SELECT Nome, CriancaId FROM Crianca";
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                SqlCeCommand cmd = new SqlCeCommand(query, conn);

                SqlCeDataAdapter da = new SqlCeDataAdapter();
                DataSet ds = new DataSet();

                da.SelectCommand = cmd;

                da.Fill(ds);
                comboBoxNomeCrianca.DisplayMember = "Nome";
                comboBoxNomeCrianca.ValueMember = "CriancaId";
                comboBoxNomeCrianca.DataSource = ds.Tables[0];
                comboBoxNomeCriancaEditar.DisplayMember = "Nome";
                comboBoxNomeCriancaEditar.ValueMember = "CriancaId";
                comboBoxNomeCriancaEditar.DataSource = ds.Tables[0];
                comboBoxVerNomeCrianca.DisplayMember = "Nome";
                comboBoxVerNomeCrianca.ValueMember = "CriancaId";
                comboBoxVerNomeCrianca.DataSource = ds.Tables[0];

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        /// <summary>
        /// Preenche a combobox com a QuotaId associada à criança.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxNomeCriancaEditar_SelectedIndexChanged(object sender, EventArgs e)
        {
            listaQuotaCriancaEditar();
        }

        /// <summary>
        /// Preenche com o numero da quota que se deseja editar. Para ver a informação sobre esta quota, é necessário ir 
        /// </summary>
        private void listaQuotaCriancaEditar()
        {
            string query = @"SELECT QuotaId FROM Quota WHERE Crianca_CriancaId = "+comboBoxNomeCriancaEditar.SelectedValue+"";
            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

            SqlCeCommand cmd = new SqlCeCommand(query, conn);
            
            SqlCeDataAdapter da = new SqlCeDataAdapter();
            DataSet ds = new DataSet();

            da.SelectCommand = cmd;

            da.Fill(ds);
            comboBoxNumeroQuota.DisplayMember = "QuotaId";
            comboBoxNumeroQuota.ValueMember = "QuotaId";
            comboBoxNumeroQuota.DataSource = ds.Tables[0];
        }

        /// <summary>
        /// Coloca a informação nos campos do formulário sempre que o utilizador seleciona a quota associada a uma criança
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxNumeroQuota_SelectedIndexChanged(object sender, EventArgs e)
        {
            preencherDadosEditar();
        }

        private void preencherDadosEditar()
        {
            if (comboBoxNumeroQuota.SelectedValue != null)
            {
                string query = @"SELECT * FROM Quota WHERE QuotaId = " + comboBoxNumeroQuota.SelectedValue + "";
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
                conn.Open();
                SqlCeCommand cmd = new SqlCeCommand(query, conn);

                SqlCeDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    dateTimePickerEditar.Value = DateTime.Parse(dr["Data"].ToString());
                    textBoxValorEditar.Text = dr["Valor"].ToString();
                    checkBoxPagamento.Checked = bool.Parse(dr["EstadoPago"].ToString());
                }
                conn.Close();
            }
        }
        
        private void checkBoxPagamento_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxPagamento.Checked == true)
                checkBoxPagamento.Text = "Pago!";
            else
                checkBoxPagamento.Text = "Não foi pago";
        }

        /// <summary>
        /// Altera a informação na base de dados relativamente à quota que se pretende editar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonEditar_Click(object sender, EventArgs e)
        {
            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            try
            {
                String data = dateTimePickerEditar.Value.Year + "-" + dateTimePickerEditar.Value.Month + "-" + dateTimePickerEditar.Value.Day;
                string varSql = "UPDATE Quota SET Data='" + data + "', Valor=" + int.Parse(textBoxValorEditar.Text) + ", EstadoPago=" + Convert.ToInt32(checkBoxPagamento.Checked) + " WHERE QuotaId=" + comboBoxNumeroQuota.SelectedValue + "";
                SqlCeCommand cmd = new SqlCeCommand(varSql, conn);
                cmd.ExecuteNonQuery();
                actualizar();
                MessageBox.Show("Dados editados");
                PreencheComboBoxNomeCrianca();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            conn.Close();
        }

        /// <summary>
        /// Preenche a datagrid view sempre que a criança é selecionada.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxVerNomeCrianca_SelectedIndexChanged(object sender, EventArgs e)
        {
            actualizar();
        }

        /// <summary>
        /// Preenche toda a grid view. Sempre que aparece uma quota que ainda não foi paga, esta aparece a vermelho.
        /// </summary>
        private void preencherDataGridView()
        {
            //Remover a possibilidade do utilizador 
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();

            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            string query = @"SELECT * FROM Quota WHERE Crianca_CriancaId = " + comboBoxVerNomeCrianca.SelectedValue + "";
            SqlCeCommand cmdDataGrid = new SqlCeCommand(query, conn);
            SqlCeDataReader drDataGrid = cmdDataGrid.ExecuteReader();
            int numCampos = drDataGrid.FieldCount;
            dataGridView1.Columns.Add("Número de quota","Numero de quota");
            dataGridView1.Columns.Add("Data", "Data");
            dataGridView1.Columns.Add("Valor a pagar", "Valor a pagar");
            dataGridView1.Columns.Add("Estado do Pagamento", "EstadoPagamento");
           
            int idxLinha = 0;
            DataGridViewCellStyle vermelho = new DataGridViewCellStyle();
            vermelho.ForeColor = Color.Red;//Irá servir para as quotas que ainda não foram pagas.
            while (drDataGrid.Read())
            {
                DataGridViewRow linha = new DataGridViewRow();
                dataGridView1.Rows.Add(linha);
                dataGridView1.Rows[idxLinha].Cells[0].Value = drDataGrid[0];
                DateTime data = DateTime.Parse(drDataGrid[1].ToString());
                dataGridView1.Rows[idxLinha].Cells[1].Value = data.ToString("dd/MM/yyyy"); 
                dataGridView1.Rows[idxLinha].Cells[2].Value = drDataGrid[2];
                string estadoPagamento = drDataGrid[3].ToString();
                if (estadoPagamento == "True")
                    dataGridView1.Rows[idxLinha].Cells[3].Value = "Pago";
                else
                    dataGridView1.Rows[idxLinha].Cells[3].Value = "Não Pago"; //E aparece a vermelho
                    if (dataGridView1.Rows[idxLinha].Cells[3].Value.ToString() == "Não Pago")
                    {
                        dataGridView1.Rows[idxLinha].DefaultCellStyle = vermelho;
                    }
                idxLinha = idxLinha + 1;
            }
            
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            drDataGrid.Close();
            conn.Close();
        }
        /// <summary>
        /// É necessário actualizar o programa com os dados mais recentes, sendo para isto necessário apenas actualizar as combo boxes, pois estam contem informação sobre o nome das crianças e o Id delas.
        /// </summary>
        private void actualizar()
        {
            listaQuotaCriancaEditar();
            preencherDataGridView();
        }
        
    }
}